#pragma once

#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/constants.hpp>
#include <boost/algorithm/string/split.hpp>
#include <iostream>
#include <string>
#include <vector>
#include <atomic>
#include <fstream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/time.h>
#include<boost/algorithm/string.hpp>

//#include <boost/algorithm/string.hpp>

namespace ns_util 
{

    //获取时间戳
    class Time_util
    {
        public:
        static std::string GetSTime()//?static//获取秒级时间戳；
        {
            struct timeval _tv;
            gettimeofday(&_tv, nullptr);
            return std::to_string(_tv.tv_sec);
        }

        static std::string GetMSTime()//获取毫秒级时间戳；
        {
            struct timeval _tv;
            gettimeofday(&_tv, nullptr);
            return std::to_string(_tv.tv_sec*1000+_tv.tv_usec/1000);
        }
    };



    const std::string temp_path="./temp/";
    class Path_file
    {
        //文件路径操作
    public:
        //文件路径相关

        //拼接出文件路径+文件名
        //file:test
        //../temp/test.suffix
        //const std::string temp_path="./temp/";//?
        static std::string Splice( const std::string& file, const std::string& suffix)//拼接出文件路径+文件名
        {
            std::string file_path=temp_path;//?文件路径
            file_path+=file;
            file_path+=suffix;
            return file_path;
        }
        //编译相关的临时文件
        //生成../temp/test.exe
        static std::string Src( const std::string& file)//拼接出文件路径+文件名
        {
            return Splice(file,".cpp");//?函数调用方法
        }

        //生成../temp/test.exe
        static std::string Exe(const std::string& file)//拼接出文件路径+文件名
        {
            return Splice(file,".exe");
            
        }
        //生成../temp/test.stderr，编译错误
        static std::string Std_com_err(const std::string& file)//拼接出文件路径+文件名
        {

            return Splice(file,".std_com_err");

        }

        //运行相关的临时文件
        //生成../temp/test.std_run_err，运行错误
        static std::string Std_run_err(const std::string& file)//拼接出文件路径+文件名
        {

            return Splice(file,".std_run_err");

        }
        //生成../temp/test.std_in，输入
        static std::string Std_in(const std::string& file)//拼接出文件路径+文件名
        {

            return Splice(file,".std_in");

        }
        //生成../temp/test.std_out，输出
        static std::string Std_out(const std::string& file)//拼接出文件路径+文件名
        {

            return Splice(file,".std_out");

        }
    };
    
    class Oper_file
    {
        //对文件操作
        public:

        //判断文件是否存在
        static bool IsFileExit(const std::string& file_path)//?
        {
            struct stat buffer;
            int _stat=stat( file_path.c_str(), &buffer);
            if(_stat == 0)
            {
                return true;
            }
            else 
            {
                return false;
            }       
        }

        static std::string UniqFileName()
        {
            static std::atomic_uint id(0);
            id++;
            std::string ms=Time_util::GetMSTime();
            std::string uniq_id=std::to_string(id);
            return ms+"_"+uniq_id;      
        }
        //写入文件
        static bool WriteToFile(const std::string& target_file,const std::string& content)
        {
            std::ofstream out(target_file);
            if(!out.is_open())
            {
                return false;
            }
            out.write(content.c_str(), content.size());
            out.close();
            return true;
        }
        //将目标文件读取出来
         static bool ReadFile(const std::string& target_file,std::string *content,bool keep=false)
        {
            (*content).clear();
            std::ifstream in(target_file);
            if(!in.is_open())
            {
                return false;
            }
            std::string line;
            while(std::getline(in,line))
            {
                (*content)+=line;
                (*content)+=(keep?"\n":"");
            }
            in.close();
            return true;
        }
    };

    //字符串处理
    class StringUtil
    {
        public:
        //字符串切分                                                                                            //分隔符
        static void SplitString(const std::string& str,std::vector<std::string>* target,const std::string& sep )
        {
            boost::split((*target),str,boost::is_any_of(sep),
            boost::algorithm::token_compress_on);
            
        }

    };
}